/*------------------------------------------------------------------------
 * PostgreSQL 手动配置设置
 *
 * 此文件包含各种配置符号和限制。在所有情况下，只有在非常罕见的情况下或
 * 对于开发人员，修改它们才有用。如果您编辑其中任何一个，请确保执行 *完整*
 * 重建（如果需要，则还要执行 initdb）。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/pg_config_manual.h
 *------------------------------------------------------------------------
 */

/*
 * 这是在运行 initdb 时未使用 --wal-segsize 选项时 wal_segment_size 的默认值。
 * 它必须是有效的段大小。
 */
#define DEFAULT_XLOG_SEG_SIZE	(16*1024*1024)

/*
 * 标识符的最大长度（例如，表名、列名、
 * 函数名）。实际名称的限制是比此少一个字节，
 * 因为长度必须包括一个结尾的零字节。
 *
 * 更改此项需要执行 initdb。
 */
#define NAMEDATALEN 64

/*
 * 函数的最大参数数量。
 *
 * 最小值为 8（GIN 索引使用 8 参数的支持函数）。
 * 可能的最大值约为 600（受 pg_proc 的索引中索引元组大小限制； 
 * 如果 BLCKSZ 大于 8K，将允许更多）。超出需求的值会浪费内存和处理时间，
 * 但不会直接增加磁盘空间成本。
 *
 * 更改此项不需要执行 initdb，但需要完全重新编译后端
 *（包括任何用户定义的 C 函数）。
 */
#define FUNC_MAX_ARGS		100

/*
 * 当创建一个基于 PostgreSQL 的衍生产品并进行更改导致
 * 加载模块的不兼容时，建议更改此字符串，以便 dfmgr.c
 * 可以拒绝加载带有干净错误信息的兼容模块。导致
 * 不兼容的典型实例是对节点标签或节点结构的任何更改。
 * （注意，dfmgr.c 已经检测到由于主要版本差异和一些
 * 更改的编译时常量而导致的常见不兼容源。此设置
 * 用于捕捉任何无法以直接方式检测到的情况。）
 *
 * 字符串没有规定格式。建议包括产品或公司名称，可选
 * 地包含任何内部相关的 ABI 版本。例如："ACME Postgres/1.2"。
 * 请注意，如果检测到 ABI 不匹配，该字符串将出现在
 * 面向用户的错误消息中。
 */
#define FMGR_ABI_EXTRA		"PostgreSQL"

/*
 * 索引中最大列数。将其设置为 32 的倍数没有意义，
 * 因为主要成本与索引元组头大小相关（见 access/itup.h）。
 *
 * 更改此项需要执行 initdb。
 */
#define INDEX_MAX_KEYS		32

/*
 * 分区键中最大列数
 */
#define PARTITION_MAX_KEYS	32

/*
 * 决定内置的 8 字节类型，包括 float8、int8 和
 * timestamp，是否按值传递。如果 sizeof(Datum) >=
 * 8（即在 64 位平台上），则默认启用。如果 sizeof(Datum) < 8（32 位平台），
 * 则必须禁用。我们将其保留作为选项，以便在 64 位平台上测试按引用传递的代码路径
 * 变得容易。
 *
 * 更改此项需要执行 initdb。
 */
#if SIZEOF_VOID_P >= 8
#define USE_FLOAT8_BYVAL 1
#endif

/*
 * 当我们没有本地自旋锁时，我们使用信号量来模拟它们。
 * 降低该值可以减少操作系统资源的消耗；增加它
 * 可能会提高性能，但提供实际的自旋锁实现可能要好得多。
 */
#define NUM_SPINLOCK_SEMAPHORES		128

/*
 * 当我们既没有自旋锁也没有原子操作支持时，我们
 * 在自旋锁之上使用信号量实现原子操作。为了在持有
 * 自旋锁时安全进行原子操作，必须使用单独的信号量。
 */
#define NUM_ATOMICS_SEMAPHORES		64

/*
 * MAXPGPATH：PostgreSQL 中路径名缓冲区的标准大小（因此，
 * 可用路径名的最大长度少一个）。
 *
 * 如果没有太多选择，我们会使用标准的系统头文件符号来表示此项：
 * MAXPATHLEN、MAX_PATH、PATH_MAX 都由不同的“标准”定义，
 * 并且在同一平台上通常有不同的值！所以我们就不再追求
 * 并在这里使用一个相当慷慨的设置。
 */
#define MAXPGPATH		1024


/*
 * PG_SOMAXCONN：传递给listen(2)的最大接受队列长度限制。你会认为应该使用来自<sys/socket.h>的SOMAXCONN，但在许多系统中，该符号的值远小于内核的实际限制。无论如何，只有在你的内核拒绝大限制值时，这个符号才需要调整，而不是默默地将值减少到它可以处理的范围（这也是大多数或几乎所有Unix系统的做法）。
 */
#define PG_SOMAXCONN	10000

/*
 * 如果你有一个字节大小不同的机器，可以尝试更改这个，但不能保证...
 */
#define BITS_PER_BYTE		8

/*
 * 磁盘I/O缓冲区的首选对齐方式。在某些CPU上，如果用户缓冲区在大于MAXALIGN的边界上对齐，则用户空间和内核空间之间的复制速度显著更快。理想情况下，这应该是一个与平台相关的值，但目前我们只是硬编码了它。
 */
#define ALIGNOF_BUFFER	32

/*
 * 如果定义了EXEC_BACKEND，postmaster将使用一种替代方法启动子进程：而不是像Unix平台标准那样简单地使用fork()，它使用fork()+exec()或Windows上的其他等效方法，以及大量额外的代码将所需的全局状态传递给这些新进程。必须在Windows上启用此设置（因为没有fork()）。在其他平台上，它只是用于验证那些特定于Windows的代码路径。
 */
#if defined(WIN32) && !defined(__CYGWIN__)
#define EXEC_BACKEND
#endif

/*
 * 如果你的操作系统支持link()，请定义此项
 */
#if !defined(WIN32) && !defined(__CYGWIN__)
#define HAVE_WORKING_LINK 1
#endif

/*
 * USE_POSIX_FADVISE控制Postgres是否尝试使用posix_fadvise()内核调用。通常自动配置测试已足够，但某些较旧的Linux发行版有损坏的posix_fadvise()版本。如果有必要，你可以在这里删除#define。
 */
#if HAVE_DECL_POSIX_FADVISE && defined(HAVE_POSIX_FADVISE)
#define USE_POSIX_FADVISE
#endif

/*
 * USE_PREFETCH代码应仅在我们有实现预取的方法时编译。（这与USE_POSIX_FADVISE解耦，因为未来可能会支持替代低级预取API。如果你更改此项，可能需要调整check_effective_io_concurrency中的错误消息。）
 */
#ifdef USE_POSIX_FADVISE
#define USE_PREFETCH
#endif

/*
 * 默认值和最大值用于 backend_flush_after、bgwriter_flush_after
 * 和 checkpoint_flush_after；以块为单位测量。当前，如果 sync_file_range() 存在，则默认为启用，即仅在 Linux 上启用。或许
 * 如果我们有 mmap 和 msync(MS_ASYNC)，也可以默认启用？
 */
#ifdef HAVE_SYNC_FILE_RANGE
#define DEFAULT_BACKEND_FLUSH_AFTER 0	/* 默认情况下从不启用 */
#define DEFAULT_BGWRITER_FLUSH_AFTER 64
#define DEFAULT_CHECKPOINT_FLUSH_AFTER 32
#else
#define DEFAULT_BACKEND_FLUSH_AFTER 0
#define DEFAULT_BGWRITER_FLUSH_AFTER 0
#define DEFAULT_CHECKPOINT_FLUSH_AFTER 0
#endif
/* 三个变量的上限 */
#define WRITEBACK_MAX_PENDING_FLUSHES 256

/*
 * USE_SSL 代码应仅在与 SSL 实现一起编译时编译。
 */
#ifdef USE_OPENSSL
#define USE_SSL
#endif

/*
 * 在编译时带了TLCP编译选项，表明支持TLCP以及国密
 */
#ifdef USE_TLCP
#define FDDGM
#endif

/*
 * 在编译时带了MMR 编译选项，表明支持多活功能
 */
#ifdef USE_MMR
#define FDDM
#endif


/*
 * 这是 AF_UNIX 套接字文件放置的默认目录。注意：更改此设置可能
 * 使您现有的客户端应用程序失效，这些应用程序可能仍会继续查找旧
 * 目录。但是，如果您讨厌在 /tmp 中使用套接字的想法，这就是
 * 您可以修改的地方。您也可以在运行时通过 postmaster 的 -k
 * 开关覆盖此设置。
 *
 * 如果设置为空字符串，则默认不使用 AF_UNIX 套接字：除非
 * 运行时配置发生更改，否则服务器不会创建 AF_UNIX 套接字，
 * 客户端默认通过 TCP/IP 连接，仅在明确指定时才使用
 * AF_UNIX 套接字。
 *
 * 由于没有良好的标准位置用于 AF_UNIX 套接字，并且许多 Windows
 * 安装尚不支持它们，因此 Windows 默认执行此操作。
 */
#ifndef WIN32
#define DEFAULT_PGSOCKET_DIR  "/tmp"
#else
#define DEFAULT_PGSOCKET_DIR ""
#endif

/*
 * 这是 Windows 事件日志的默认事件源。
 */
#define DEFAULT_EVENT_SOURCE  "PostgreSQL"

/*
 * 在 PPC 机器上，决定是否在 LWARX 指令中使用互斥提示位。
 * 设置提示位将稍微提高 POWER6 及更高机器的自旋锁性能，
 * 但在此之前没有任何作用，并且会导致某些 pre-POWER4
 * 机器上的非法指令失败。默认情况下，我们在构建 64 位
 * PPC 时使用提示位，这在几乎所有情况下都是安全的。
 * 如果您正在为已知的较新 PPC 机器构建 32 位代码，您可能
 * 想要覆盖此设置。
 */
#ifdef HAVE_PPC_LWARX_MUTEX_HINT	/* 无论如何必须具有汇编器支持 */
#if defined(__ppc64__) || defined(__powerpc64__)
#define USE_PPC_LWARX_MUTEX_HINT
#endif
#endif

/*
 * 在 PPC 机器上，决定是否使用 LWSYNC 指令来替代
 * ISYNC 和 SYNC。这提供了稍微更好的性能，但会
 * 导致某些 pre-POWER4 机器上的非法指令失败。
 * 默认情况下，我们在构建 64 位 PPC 时使用 LWSYNC，
 * 这在几乎所有情况下都是安全的。
 */
#if defined(__ppc64__) || defined(__powerpc64__)
#define USE_PPC_LWSYNC
#endif

/*
 * 假定的缓存行大小。这不会影响正确性，但可以用于
 * 低级优化。目前，这用于在 xlog.c 中填充一些数据
 * 结构，以确保高度争用的字段位于不同的缓存行上。
 * 值过小可能会由于伪共享而影响性能，而值过大
 * 仅会造成几字节的内存浪费。默认值是 128，这对于
 * 所有支持的平台应该足够大。
 */
#define PG_CACHE_LINE_SIZE		128

/*
 *------------------------------------------------------------------------
 * 以下符号用于启用调试代码，而不是用于控制
 * 用户可见的功能或资源限制。
 *------------------------------------------------------------------------
 */

/*
 * 包含 Valgrind "client requests"，主要在内存分配器中，
 * 以便 Valgrind 理解 PostgreSQL 内存上下文。这允许检测
 * Valgrind 在普通构建中无法检测到的内存错误。它还
 * 启用检测在没有持有
 * buffer pin 的情况下发生的缓冲区访问（或者在索引访问
 * 方法因其自定义的客户端请求覆盖通用的 bufmgr.c 请求的情况下，没有持有缓冲区锁）。
 *
 * 在 Valgrind 下运行 "make installcheck" 显著变慢。客户端
 * 请求落在热点代码路径上，因此 USE_VALGRIND 即使在没有在 Valgrind 下运行的情况下，也会将执行速度降低几个百分点。
 *
 * 在没有使用 USE_VALGRIND 构建服务器的情况下，不要尝试在 Valgrind 下测试服务器；否则你会从 sinval
 * 消息中得到假阳性（请参见 AddCatcacheInvalidationMessage 中的评论）。使用抑制文件 src/tools/valgrind.supp 来
 * 排除其他已知假阳性也很重要。
 *
 * 通常情况下，你应该在 USE_VALGRIND 下使用 MEMORY_CONTEXT_CHECKING；
 * 没有它，repalloc() 的仪器化效果会很差。
 */
/* #define USE_VALGRIND */

/*
 * 定义此项以使 pfree() 的内存立即被清除，以
 * 便捕捉引用已释放值的错误。
 * 目前，如果启用 --enable-cassert，它会自动定义。
 */
#ifdef USE_ASSERT_CHECKING
#define CLOBBER_FREED_MEMORY
#endif

/*
 * 定义此项以检查内存分配错误（对分配字节的超范围写入）。
 * 目前，如果启用 --enable-cassert 或 USE_VALGRIND，它会自动定义。
 */
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
#define MEMORY_CONTEXT_CHECKING
#endif

/*
 * 定义此项以使 palloc() 分配的内存填充随机数据，以
 * 便捕捉依赖未初始化内存内容的代码。注意：这非常昂贵。
 */
/* #define RANDOMIZE_ALLOCATED_MEMORY */

/*
 * 用于缓存失效调试，定义 DISCARD_CACHES_ENABLED 以启用
 * 使用 debug_discard_caches GUC 在可以发送失效时积极刷新 syscache/relcache
 * 条目。有关详细信息，请参见 src/backend/utils/cache/inval.c 中的 
 * AcceptInvalidationMessages()。
 *
 * USE_ASSERT_CHECKING 构建默认启用此功能。可以在没有 cassert 构建和隐含的
 * CLOBBER_FREED_MEMORY 和 MEMORY_CONTEXT_CHECKING 选项的情况下使用
 * DISCARD_CACHES_ENABLED，但不太可能有效地识别问题。
 */
/* #define DISCARD_CACHES_ENABLED */

#if defined(USE_ASSERT_CHECKING) && !defined(DISCARD_CACHES_ENABLED)
#define DISCARD_CACHES_ENABLED
#endif

/*
 * 向后兼容旧的仅编译时间的 clobber-cache
 * 宏。
 */
#if !defined(DISCARD_CACHES_ENABLED) && (defined(CLOBBER_CACHE_ALWAYS) || defined(CLOBBER_CACHE_RECURSIVELY))
#define DISCARD_CACHES_ENABLED
#endif

/*
 * 当失效发生时恢复用于 relcache 条目的内存。有关
 * 详情，请参见 src/backend/utils/cache/relcache.c 中的 
 * RelationBuildDescr()。
 *
 * 当 clobbering 活动时，这在 clobber-cache 构建中会自动激活，
 * 但可以通过显式定义 RECOVER_RELATION_BUILD_MEMORY 在这里覆盖。
 * 定义为 1 以在 clobber 关闭时始终释放关系缓存的内存，
 * 定义为 0 以在 clobbering 开启时从不释放关系缓存的内存。
 */
 /* #define RECOVER_RELATION_BUILD_MEMORY 0 */	/* 强制禁用 */
 /* #define RECOVER_RELATION_BUILD_MEMORY 1 */	/* 强制启用 */

/*
 * 定义此项以强制所有解析和计划树通过
 * copyObject()，以便捕捉 copyObject() 中的错误和遗漏。
 */
/* #define COPY_PARSE_PLAN_TREES */

/*
 * 定义此项以强制所有解析和计划树通过
 * outfuncs.c/readfuncs.c，以便捕捉这些模块中的错误和遗漏。
 */
/* #define WRITE_READ_PARSE_PLAN_TREES */

/*
 * 定义此项以强制所有 DML 语句的原始解析树通过
 * raw_expression_tree_walker()，以便捕捉该函数中的错误和遗漏。
 */
/* #define RAW_EXPRESSION_COVERAGE_TEST */

/*
 * 启用与锁相关操作的调试打印语句。
 */
/* #define LOCK_DEBUG */

/*
 * 启用与 WAL 相关操作的调试打印语句；另请参阅
 * wal_debug GUC 变量。
 */
/* #define WAL_DEBUG */

/*
 * 启用排序操作期间的资源消耗跟踪；
 * 另请参阅 trace_sort GUC 变量。对于 8.1，这默认启用。
 */
#define TRACE_SORT 1

/*
 * 启用同步扫描操作的跟踪（另请参阅 trace_syncscan GUC 变量）。
 */
/* #define TRACE_SYNCSCAN */
